package com.bestvike.stone.core.lang;

import org.apache.commons.codec.binary.Base64;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * base64 编码/解码
 * Created by 许崇雷 on 2017/7/16.
 */
public final class Base64Utils {
    /**
     * base64 编码
     *
     * @param value 原始数据
     * @return base64 字符串
     */
    public static String encode(byte[] value) {
        return Base64.encodeBase64String(value);
    }

    /**
     * base64 解码
     *
     * @param value base64 字符串
     * @return 原始数据
     */
    public static byte[] decode(String value) {
        try {
            return Base64.decodeBase64(value);
        } catch (Exception e) {
            throw new RuntimeException("指定的字符串不能用 base64 解码", e);
        }
    }

    /**
     * 对字符串 base64 编码
     *
     * @param value 原始字符串,utf-8 编码
     * @return base64 字符串
     */
    public static String encodeString(String value) {
        return encodeString(value, StandardCharsets.UTF_8);
    }

    /**
     * 对字符串 base64 编码
     *
     * @param value   原始字符串
     * @param charset 原始字符串编码
     * @return base64 字符串
     */
    public static String encodeString(String value, Charset charset) {
        return encode(value.getBytes(charset));
    }

    /**
     * 对字符串 base64 编码
     *
     * @param value       原始字符串
     * @param charsetName 原始字符串编码
     * @return base64 字符串
     */
    public static String encodeString(String value, String charsetName) {
        try {
            return encode(value.getBytes(charsetName));
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("不支持的编码", e);
        }
    }

    /**
     * base64 解码并转为字符串
     *
     * @param value base64 字符串
     * @return 原始字符串, utf-8 编码
     */
    public static String decodeString(String value) {
        return decodeString(value, StandardCharsets.UTF_8);
    }

    /**
     * base64 解码并转为字符串
     *
     * @param value   base64 字符串
     * @param charset 原始字符串编码
     * @return 原始字符串
     */
    public static String decodeString(String value, Charset charset) {
        return new String(decode(value), charset);
    }

    /**
     * base64 解码并转为字符串
     *
     * @param value       base64 字符串
     * @param charsetName 原始字符串编码
     * @return 原始字符串
     */
    public static String decodeString(String value, String charsetName) {
        try {
            return new String(decode(value), charsetName);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("不支持的编码", e);
        }
    }
}
